package com.itcam.lease.web.admin.controller.login;


import com.itcam.lease.common.context.LoginUserContext;
import com.itcam.lease.common.result.Result;
import com.itcam.lease.common.utils.JWTUtil;
import com.itcam.lease.web.admin.service.LoginService;
import com.itcam.lease.web.admin.vo.login.CaptchaVo;
import com.itcam.lease.web.admin.vo.login.LoginVo;
import com.itcam.lease.web.admin.vo.system.user.SystemUserInfoVo;
import io.jsonwebtoken.Claims;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

@Tag(name = "后台管理系统登录管理")
@RestController
@RequestMapping("/admin")
public class LoginController {

    @Autowired
    private LoginService loginService;

    /**
     * 获取图形验证码
     * @return
     */
    @Operation(summary = "获取图形验证码")
    @GetMapping("login/captcha")
    public Result<CaptchaVo> getCaptcha() {
        CaptchaVo captcha = loginService.getCaptcha();
        return Result.ok(captcha);
    }

    /*
    - - 知识点：

    - 本项目Reids中的key需遵循以下命名规范：**项目名:功能模块名:其他**，例如`admin:login:123456`

    - `spring-boot-starter-data-redis`已经完成了`StringRedisTemplate`的自动配置，我们直接注入即可。

    - 为方便管理，可以将Reids相关的一些值定义为常量，例如key的前缀、TTL时长，内容如下。
    可将这些常量统一定义在**common模块**下的`com.itcam.lease.common.constant.RedisConstant`类中

      ```java
      public class RedisConstant {
          public static final String ADMIN_LOGIN_PREFIX = "admin:login:";
          public static final Integer ADMIN_LOGIN_CAPTCHA_TTL_SEC = 60;
          public static final String APP_LOGIN_PREFIX = "app:login:";
          public static final Integer APP_LOGIN_CODE_RESEND_TIME_SEC = 60;
          public static final Integer APP_LOGIN_CODE_TTL_SEC = 60 * 10;
          public static final String APP_ROOM_PREFIX = "app:room:";
      }
      ```

     */

    /**
     * 登录
     * @param loginVo
     * @return
     */
    @Operation(summary = "登录")
    @PostMapping("login")
    public Result<String> login(@RequestBody LoginVo loginVo) {
        String token = loginService.login(loginVo);
        return Result.ok(token);
    }

    /**
     * 获取登陆用户个人信息
     *
     * @param token 从请求头中获取的 access-token
     * @return 返回包含用户个人信息的响应
     */
    @Operation(summary = "获取登陆用户个人信息")
    @GetMapping("info")
    public Result<SystemUserInfoVo> info(@RequestHeader("access-token") String token) {
        // 解析 JWT 令牌
        Claims claims = JWTUtil.parseToken(token);
        // 从 claims 中获取 userId
        Long userId = claims.get("userId", Long.class);
        // 根据 userId 获取用户个人信息
        SystemUserInfoVo userInfo = loginService.getLoginUserInfo(userId);
        // 返回包含用户个人信息的响应
        return Result.ok(userInfo);
    }


}